home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Users Group Library 1996 July / C-C++ Users Group Library July 1996.iso / vol_200 / 228_01 / msweep.c < prev    next >
Text File  |  1987-07-29  |  15KB  |  831 lines

  1. /*
  2. HEADER:         CUGXXX;
  3. TITLE:          MS-DOS file utility;
  4. DATE:           6-2-85;
  5. DESCRIPTION:    MS-DOS file utility based on CP/M NSWEEP;
  6. KEYWORDS:       File organizer, file utility;
  7. FILENAME:       MSWEEP.C;
  8. WARNINGS:       None;
  9. AUTHORS:        Ferdinand Knerlich;
  10. COMPILER:       DeSmet C;
  11. REFERENCES:     US-DISK 1308;
  12. ENDREF
  13. */
  14. /* mswp  ver. 1.00  release prototype     6-2-85
  15.  
  16.      ms-dos file manipulation utility
  17.      based on the cp/m nsweep program
  18.  
  19.      written by ferdinand knerlich, 6-2-85
  20.  
  21. */
  22.  
  23.  
  24. #define SP 32
  25. #define CR 13
  26. #define DC3 19
  27. #define EOF -1
  28. #define ERR -1
  29. #define unsn unsigned
  30.  
  31. struct {
  32.   char dta_reserved[21];
  33.   char dta_attribute;
  34.   short int dta_time;
  35.   short int dta_date;
  36.   long int dta_file_size;
  37.   char dta_name[13];
  38.   } DTA;
  39.  
  40. struct d_entry{
  41.   char      e_attribute;
  42.   short int  e_time;
  43.   short int  e_date;
  44.   long int  e_file_size;
  45.   char      e_name[13];
  46.   char e_tag;
  47.   int e_num;
  48.   } entry[500];
  49.  
  50. int entries;
  51. int num;
  52. int fil1,fd1,fd2;
  53. char e_buf[40];
  54. char f_buf[40];
  55. char dest_buf[40];
  56.  
  57. char files[] = "*.*";
  58. char drv[5] = " :";
  59. char ddrv[5] = " ";
  60. int long_format = 0;
  61. int time_sort = 0;
  62. int reverse_order = 0;
  63. int single_column = 0;
  64.  
  65. int showhide = 0;
  66. char volume[13];
  67.  
  68. unsn avail,total,sectors,bytes;
  69.  
  70. main(argc, argv)
  71.   short int argc; char *argv[];
  72.  
  73. {
  74.   char devarg[85];
  75.   char fname[20];
  76.   int c,d,tag,prpt;
  77.   int xit,j,lncnt,def_drv;
  78.   long int tag_tot,totu,tota;
  79.   char fc,nc,cur_dsk;
  80.  
  81.   char tag,prpt;
  82.   char ver;
  83.  
  84.   /* set the Data Transfer Address to the local block */
  85. #asm
  86.   mov     dx, offset DTA_
  87.   mov     ah, 01AH      ; set disk transfer address
  88.   int     21H
  89. #
  90.  
  91.   scr_clr();
  92.   scr_rowcol(0,0);
  93.  
  94.   printf("\n* msweep file utility *  ver 1.00  6-2-85  ferdinand knerlich\n");
  95.   printf("            [press '?' key for help : 'X' key to eXit]");
  96.  
  97.   entries = xit = num = 0;
  98.  
  99.   ver = 0;
  100.  
  101.   def_drv = (drv[0] = cur_drv()) - 'A';
  102.  
  103.  
  104.   strcat(devarg,files);
  105.  
  106.   if (argc > 1)
  107.   {
  108.     drv[0] = toupper(argv[1][0]);
  109.   }
  110.  
  111.  
  112.   tag_tot = 0;
  113.  
  114.   login(drv[0]);
  115.  
  116.   while(!(xit))
  117.   {
  118.  
  119.     if(entries > 0) display_e(num);
  120.     else printf("\nno files\n");
  121.  
  122.     fc = tolower(ci()); if (!fc) nc = tolower(ci());
  123.  
  124.     switch(fc) {
  125.  
  126.       case SP: case CR : /* forward */
  127.  
  128.         if (num > entries-2) {
  129.           num = 0;
  130.           co('\n'); }
  131.         else num++;
  132.  
  133.         break;
  134.       case 'a': /* retag */
  135.         for( j=0; j<=entries;j++)
  136.         {
  137.           if(entry[j].e_tag == 1)
  138.           {   entry[j].e_tag = 2;
  139.               tag_tot += entry[j].e_file_size;
  140.               fmtebuf(j);
  141.               printf("\n %14s %6D retagged",
  142.               e_buf,
  143.               tag_tot);
  144.           }
  145.         }
  146.         break;
  147.  
  148.       case 'b': /* back one */
  149.  
  150.         if (num < 1) {
  151.           num = entries-1;
  152.           co('\n'); }
  153.         else num--;
  154.  
  155.         break;
  156.  
  157.       case 'c': /* copy */
  158.  
  159.         printf("to drive ? ");
  160.         do
  161.           (c=toupper(getchar()));
  162.         while (!(c >= 'A' && c <= 'Z' ));
  163.  
  164.         ddrv[0] = c; ddrv[1] = ':'; ddrv[2] = '\0';
  165.  
  166.         fmtebuf(num);
  167.  
  168.         cope(num);
  169.  
  170.         break;
  171.  
  172.       case 'd': /* delete */
  173.         printf(" really (y/n) ? ");
  174.         c=toupper(getchar());
  175.  
  176.         if(c=='Y')
  177.         {
  178.           fmtebuf(num);
  179.           del(e_buf,num);
  180.         }
  181.         break;
  182.  
  183.       case 'e': /* erase t/u */
  184.  
  185.         tag = 0;
  186.         printf("\ntagged or untagged (t/u) ? ");
  187.           tag = toupper(getchar());
  188.  
  189.         if (tag)
  190.         {
  191.           printf("\nprompt (y/n) ? ");
  192.             prpt = toupper(getchar());
  193.             if (prpt != 'N') prpt = 'Y';
  194.  
  195.           for( j=0; j<=(entries-1);j++)
  196.           {
  197.             if(entry[j].e_tag == 2 &&  tag=='T')
  198.             {
  199.             tag_tot -= entry[j].e_file_size;
  200.             entry[j].e_tag = 1;
  201.  
  202.             fmtebuf(j);
  203.             if (prpt == 'Y')
  204.             {
  205.               printf("\ndelete %14s (y/n) ? ",e_buf);
  206.               c=toupper(getchar());
  207.  
  208.               if(c=='Y')
  209.               {
  210.               printf("\ndeleting %14s",e_buf);
  211.               del(e_buf,j);
  212.               j--;
  213.               }
  214.             }
  215.             else {
  216.                    printf("\ndeleting %14s",e_buf);
  217.                    del(e_buf,j);
  218.                    j--;
  219.                  }
  220.             }
  221.             else if(entry[j].e_tag != 2 &&  tag=='U')
  222.             {
  223.             fmtebuf(j);
  224.             if (prpt == 'Y')
  225.             {
  226.               printf("\ndelete %14s (y/n) ? ",e_buf);
  227.               c=toupper(getchar());
  228.  
  229.               if(c=='Y')
  230.               {
  231.                 printf("\ndeleting %14s",e_buf);
  232.                 del(e_buf,j);
  233.                 j--;
  234.               }
  235.             }
  236.             else {
  237.                    printf("\ndeleting %14s",e_buf);
  238.                    del(e_buf,j);
  239.                    j--;
  240.                  }
  241.  
  242.              }
  243.  
  244.           }
  245.         }
  246.  
  247.         break;
  248.  
  249.       case 'f': /* find */
  250.  
  251.         break;
  252.       case 'g': /* chg attributes */
  253.  
  254.         break;
  255.  
  256.       case 'l': /* log new dir */
  257.         printf(" drive ? ");
  258.         do
  259.           (c=toupper(getchar()));
  260.         while (!(c >= 'A' && c <= 'Z' ));
  261.  
  262.         drv[0] = c ;
  263.  
  264.         login(drv[0]);
  265.  
  266.         tag_tot = 0;
  267.         break;
  268.  
  269.       case 'm': /* mass file copy */
  270.  
  271.         printf("to drive ? ");
  272.         do
  273.           (c=toupper(getchar()));
  274.         while (!(c >= 'A' && c <= 'Z' ));
  275.  
  276.         ddrv[0] = c; ddrv[1] = ':'; ddrv[2] = '\0';
  277.  
  278.         tag = 0;
  279.         printf("\ntagged or untagged (t/u) ? ");
  280.           tag = toupper(getchar());
  281.  
  282.         if (tag)
  283.         {
  284.           printf("\nprompt (y/n) ? ");
  285.             prpt = toupper(getchar());
  286.             if (prpt != 'N') prpt = 'Y';
  287.  
  288.           for( j=0; j<=(entries-1) ;j++)
  289.           {
  290.             if(entry[j].e_tag == 2 &&  tag=='T')
  291.             {
  292.             tag_tot -= entry[j].e_file_size;
  293.             entry[j].e_tag = 1;
  294.  
  295.             fmtebuf(j);
  296.             if (prpt == 'Y')
  297.             {
  298.               printf("\ncopy %14s (y/n) ? ",e_buf);
  299.               c=toupper(getchar());
  300.  
  301.               if(c=='Y') cope(j);
  302.             }
  303.             else cope(j);
  304.             }
  305.             else if(entry[j].e_tag != 2 &&  tag=='U')
  306.             {
  307.             fmtebuf(j);
  308.             if (prpt == 'Y')
  309.             {
  310.               printf("\ncopy %14s (y/n) ? ",e_buf);
  311.               c=toupper(getchar());
  312.  
  313.               if(c=='Y') cope(j);
  314.             }
  315.             else cope(j);
  316.  
  317.              }
  318.  
  319.           }
  320.         }
  321.  
  322.         break;
  323.  
  324.       case 'r': /* rename */
  325.         if(get_f(fname))
  326.         {
  327.           fmtebuf(num);
  328.           if(rename(e_buf,fname) != -1)
  329.           {
  330.             printf(" rename successful !\n");
  331.             strcpy(entry[num].e_name,fname);
  332.  
  333.           }
  334.           else printf(" error, not renamed \n");
  335.         }
  336.  
  337.         break;
  338.       case 's': /* stats */
  339.  
  340.         cur_dsk = cur_drv();
  341.  
  342.         printf(" drive ? ");
  343.         do
  344.           (c=toupper(getchar()));
  345.         while (!(c >= 'A' && c <= 'Z' ));
  346.  
  347.  
  348.         chg_drv( (int)c - 'A');
  349.  
  350.         totu = tota = avail = total = sectors = bytes = 0;
  351.  
  352.         free_drv(0);
  353.  
  354.         totu = ((long)total - (long)avail) * (long)sectors * (long)bytes;
  355.         tota = (long)avail * (long)sectors * (long)bytes;
  356.  
  357.  
  358.         printf("\n\ndrive %c: has %8D used / %8D free \n",
  359.                c,
  360.                totu,
  361.                tota );
  362.  
  363.         chg_drv( (int)cur_dsk - 'A' );
  364.  
  365.         break;
  366.  
  367.       case 't': /* tag file */
  368.         if( (entry[num].e_tag==0) || (entry[num].e_tag==1) )
  369.         {
  370.           entry[num].e_tag = 2;
  371.           tag_tot += entry[num].e_file_size;
  372.           printf(" %6D ",tag_tot);
  373.         }
  374.         else if( entry[num].e_tag==2 )
  375.           printf(" %6D",tag_tot);
  376.  
  377.         if (num > entries-2)
  378.         {
  379.           num = 0;
  380.           co('\n');
  381.         }
  382.         else num++;
  383.  
  384.         break;
  385.  
  386.       case 'u': /* untag file */
  387.         if( entry[num].e_tag==2 )
  388.         {
  389.           entry[num].e_tag = 0;
  390.           tag_tot -= entry[num].e_file_size;
  391.           printf(" %6D ",tag_tot);
  392.         }
  393.         else if(( entry[num].e_tag==0 ) || ( entry[num].e_tag==1) )
  394.           printf(" %6D",tag_tot);
  395.  
  396.         if (num > entries-2)
  397.         {
  398.           num = 0;
  399.           co('\n');
  400.         }
  401.         else num++;
  402.  
  403.         break;
  404.  
  405.       case 'v': /* view file */
  406.  
  407.         fmtebuf(num);
  408.  
  409.         if (strlen(drv)>1)
  410.         { strcpy(f_buf,drv);
  411.           strcat(f_buf,e_buf);}
  412.         else strcpy(f_buf,e_buf);
  413.  
  414.         scr_clr();
  415.         scr_rowcol(0,0);
  416.  
  417.         if (!(fil1 = fopen(f_buf,"r")))
  418.         {
  419.           printf("\nopen error\n");
  420.           break;
  421.         }
  422.       printf("Press 'S' to freeze/unfreeze display and 'X' to quit view.\n");
  423.  
  424.         putchar('\n');putchar('\n');
  425.         while ((c=fgetc(fil1)) != EOF && d != 'x')
  426.         {
  427.           d=tolower(scr_csts());
  428.           if (d=='s') while(!scr_csts());
  429.           putchar(c);
  430.         }
  431.         d=' ';
  432.         putchar('\n');
  433.         fclose(fil1);
  434.         break;
  435.  
  436.       case 'w': /* wildcard tag */
  437.  
  438.         break;
  439.  
  440.       case 'q':case 'x': /* exit */
  441.         xit = 1;
  442.         break;
  443.  
  444.       case 'y': /* set verifY on */
  445.         ver = 1 - ver;
  446.         ver = set_ver(ver);
  447.         printf("\n\nverify is now: ");
  448.         (ver ? printf("on\n") : printf("off\n"));
  449.         break;
  450.  
  451.       case '?': /* display help file */
  452.  
  453. scr_clr();
  454. scr_rowcol(0,0);
  455.  
  456. printf("\n\n* msweep file utility *  ver 1.00  6-2-85  ferdinand kner